#include <algorithm>
#include <cctype>
#include <cstdio>

typedef long long ll;

template <typename T>
inline T &read(T &x) {
  x = 0;
  bool f = false;
  short ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = true;
    ch = getchar();
  }
  while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ '0'), ch = getchar();
  if (f) x = -x;
  return x;
}

const int N = 1e3 + 5, mod = 998244353;
int n, m, A;
ll C[N][N];

ll qpow(ll base, int index) {
  ll res = 1;
  while (index) {
    if (index & 1) res = res * base % mod;
    base = base * base % mod;
    index >>= 1;
  }
  return res;
}

inline ll getinv(ll x) { return qpow(x, mod - 2); }

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen64("/tmp/CodeTmp/testdata.in", "r", stdin);
  freopen64("/tmp/CodeTmp/testdata.out", "w", stdout);
#else
  freopen("legend.in", "r", stdin);
  freopen("legend.out", "w", stdout);
#endif
#endif

  read(n), read(m), read(A);
  C[0][0] = 1;
  for (int i = 1; i <= std::max(m, n); ++i) {
    C[i][0] = 1;
    for (int j = 1; j <= i; ++j)
      if ((C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod) >= mod)
        C[i][j] -= mod;
  }
  long long ans = 0;
  for (int i = 0; i <= n; ++i)
    for (int j = 1; j <= std::min(A, m); ++j) {
      long long s = 0;
      for (int t = 1; t <= n - i; ++t)
        if ((s += C[n - i][t] * qpow(A - j, n - i - t) % mod) >= mod) s %= mod;
      for (int k = 1; k + i <= n && m - j * k >= i; ++k) {
        long long p = 0;
        for (int t = 0; t <= i && m - k * j - t * (j - 1) >= i; ++t)
          if (t & 1) {
            if ((p -= C[i][t] * C[m - k * j - t * (j - 1)][i] % mod) < 0)
              p %= mod;
          } else if ((p += C[i][t] * C[m - k * j - t * (j - 1)][i] % mod) >=
                     mod)
            p %= mod;
        ans += p * C[n][i] % mod * s % mod, ans %= mod;
        s -= C[n - i][k] * qpow(A - j, n - i - k), s %= mod;
      }
    }
  printf("%lld", (ans * getinv(qpow(A, n)) % mod + mod) % mod);
  return 0;
}